package com.yds.modewithprinceple.prototype;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.util.Log;
import android.view.View;

import com.yds.modewithprinceple.R;
import com.yds.modewithprinceple.databinding.ActivityPrototypePatternBinding;
import com.yds.modewithprinceple.prototype.Master;
import com.yds.modewithprinceple.prototype.Person;

/**
 * 原形模式
 * 由原形实例指定创建对象的种类，并通过拷贝这些原形创建新的对象
 * 原形模式是一种创建型模式，原形模式多用于创建复杂对象或者构造耗时的实例。
 * 它的作用主要是"克隆"，用户从原形对象复制出一个内部属性一样的对象。
 * 因为类的初始化需要耗费很多的资源，原形拷贝则可以更高效。
 *
 * 总结
 * 最后，原形模式其实就是对象的拷贝，使用原形模式可以解决复杂对象构建资源消耗的问题。
 * 也可以用来只读保护。
 * 注意其clone时不会走构造函数。
 */
@SuppressWarnings("all")
public class PrototypePatternActivity extends AppCompatActivity implements View.OnClickListener {
    private ActivityPrototypePatternBinding binding;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        binding = ActivityPrototypePatternBinding.inflate(getLayoutInflater());
        setContentView(binding.getRoot());

        binding.btShallowCopy.setOnClickListener(this);
        binding.btDeepCopy.setOnClickListener(this);

        binding.tvPrototypeIntroduce.setText("/**\n" +
                " * 原形模式\n" +
                " * 由原形实例指定创建对象的种类，并通过拷贝这些原形创建新的对象\n" +
                " * 原形模式是一种创建型模式，原形模式多用于创建复杂对象或者构造耗时的实例。\n" +
                " * 它的作用主要是\"克隆\"，用户从原形对象复制出一个内部属性一样的对象。\n" +
                " * 因为类的初始化需要耗费很多的资源，原形拷贝则可以更高效。\n" +
                " *\n" +
                " * 总结\n" +
                " * 最后，原形模式其实就是对象的拷贝，使用原形模式可以解决复杂对象构建资源消耗的问题。\n" +
                " * 也可以用来只读保护。\n" +
                " * 注意其clone时不会走构造函数。\n" +
                " */");

    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            /**
             * 1、对象xiaoHong由xiaoMing克隆生成。
             * 2、调用clone方法克隆一个对象时不会走其构造方法。
             */
            case R.id.btShallowCopy:
                Person person1 = new Person();
                person1.setAge(10);
                person1.setName("zhangsan");
                person1.addBook("a");
                person1.addBook("b");
                person1.addBook("c");

                Person person2 = (Person) person1.clone();
                person2.setName("lisi");
                person2.setAge(15);
                person2.addBook("d");

                Log.i("Simon", "person1 = " + person1.toString());
                Log.i("Simon", "person2 = " + person2.toString());
                break;
            /**
             * 1、浅拷贝：获得变量本身，深拷贝：获得一个新的一模一样的变量
             * 2、深拷贝的只读保护
             */
            case R.id.btDeepCopy:
                Master master = Master.getInstance();
                //模拟同包下设置person属性
                master.setOriginalPerson();
                Log.i("Simon", "original1 person = " + master.getPerson().toString());

                Person person = master.getPerson();
                person.setAge(100);
                Log.i("Simon", "change person = " + person.toString());
                Log.i("Simon", "original2 person = " + master.getPerson().toString());
                break;
        }
    }
}